# -*- coding: utf-8 -*-
from PIL import Image,ImageDraw,ImageFont,ImageStat,ImageChops
from skimage import io,exposure,transform,img_as_float,util
import matplotlib.image 
from scipy import misc
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.pylab as pl

#读取图片方式
#1.从PIL中导入Image库进行读取---类型为Image
img=Image.open('F:\\python练习\\图像实战练习\\images\\69015.jpg')
#2.使用skimage库进行读取----类型为uint8
img1=io.imread('F:\\python练习\\图像实战练习\\images\\messi.png')
#3.使用matplotlib礼拜读取---类型为unit8
#img2=matplotlib.image.imread('F:\\python练习\\图像实战练习\\images\\ronaldo.png')
img2=io.imread('F:\\python练习\\图像实战练习\\images\\ronaldo.png')
#使用misc模块进行读取----
img3=misc.imread('F:\\python练习\\图像实战练习\\images\\69015.jpg')



#处理不同格式
#1.转化为另一种格式
#img.save('1.png')
#如果为RGBA模式先要转化为RGB，
#img.convert('RGB').save('1.png')


#转化图像模式
#转为灰度图
#方法1（需要数组类型）
#im=rgb2gray(img3)
#plt.subplot(121),plt.imshow(img3,cmap='gray'),plt.axis('off')
#plt.subplot(122),plt.imshow(im,cmap='gray'),plt.axis('off')
#plt.show()

#plt.imshow(im)
##方法2(需要图片类型)
#im=img.convert('L')
#im.show()



#转化颜色空间
#rgb转hsv
#from skimage.color import rgb2hsv
#im_hsv=rgb2hsv(img3)
##io.imshow(im_hsv)
#plt.gray()
#plt.figure(figsize=(10,8))
#plt.subplot(221),plt.imshow(im_hsv[...,0]),plt.title('h',size=20)
#plt.axis('off')
#plt.subplot(222),plt.imshow(im_hsv[...,1]),plt.title('s',size=20)
#plt.axis('off')
#plt.subplot(223),plt.imshow(im_hsv[...,2]),plt.title('v',size=20)
#plt.axis('off')
#plt.subplot(224),plt.axis('off')
#plt.show()



#使用matplotlib imshow显示插值
#kl=io.imread('F:\\python练习\\图像实战练习\\images\\lena_small.jpg')
#methods=['none','nearest','bilinear','bicubic','spline16','lanczos']
#fig,axes=plt.subplots(nrows=2,ncols=3,figsize=(8,10),subplot_kw={'xticks':[],'yticks':[]})
#fig.subplots_adjust(left=0.03, right=0.97, hspace=0.1, wspace=0.05)
#for ax, interp_method in zip(axes.flat, methods):
#    ax.imshow(kl, interpolation=interp_method, cmap='viridis')
#    ax.set_title(str(interp_method))
#plt.tight_layout()
#plt.show()



#转化数据结构----对于Image图片类型
#sj=np.array(img)
#讲numpy ndarray转化为Image对象
#sj1=Image.fromarray(sj)

#使用数组对图像进行切片
#x,y,z=img1.shape
#x1,y1=np.ogrid[0:x,0:y]
#mask=(x1-x/2)**2+(y1-y/2)**2>x*y/4
#img1[mask,:]=0
#io.imshow(img1)

#简单图像变形--使用交叉溶解的连个图像a混合
#归一化处理
#import matplotlib.pyplot as plt
#im1=img1/255
#im2=img2/255
#i=1
#plt.figure(figsize=(10,10))
#for alpha in np.linspace(0,1,20):
#    plt.subplot(4,5,i)
#    plt.imshow((1-alpha)*im1+alpha*im2)
#    plt.axis('off')
#    i+=1
#plt.subplots_adjust(wspace=0.05,hspace=0.05)
#plt.show()

#裁剪图像----使用crop进行裁剪---后面两个要大于前面两个
#读取鹦鹉的图-----模式要为Imag
img_yu=Image.open('F:\\python练习\\图像实战练习\\images\\parrot.png')
#img_cj=img_yu.crop((175,75,320,200))
##img_cj.show()
#plt.figure(figsize=(10,8))
#plt.subplot(221),plt.imshow(img_yu),plt.title('Orig',size=20)
#plt.axis('off')
#plt.subplot(222),plt.imshow(img_cj),plt.title('crop',size=20)
#plt.axis('off')
#plt.show()



#调整大小-----resize
#im_large=img_yu.resize((img_yu.width*4,img_yu.height*4),Image.BILINEAR)
#im_large.show()
#im_small=img_yu.resize((img_yu.width//4,img_yu.height//4),Image.ANTIALIAS)
#im_small.show()


#图像负片----point()函数---每一个像素
#im_t=img_yu.point(lambda x:255-x)
#im_t.show()

#灰度级变换
#对数变换
#img_log=img_yu.point(lambda x:255*np.log(1+x/255))
#img_log.show()
#使用skimage中的exposure中的adjust_log函数
#img_log1=exposure.adjust_log(img1,2)
#io.imshow(img_log1)

#幂律变换
#im_gg=img_yu.point(lambda x:255*(x/255)**0.6)
#im_gg.show()

#镜像图像
#im_jx=img_yu.transpose(Image.FLIP_LEFT_RIGHT)
#im_jx.show()
#im_sx=img_yu.transpose(Image.FLIP_TOP_BOTTOM)
#im_sx.show()

#旋转图像---rotate
#im_45=img_yu.rotate(45)
#im_90=img_yu.rotate(90)
#im_45.show()
#im_90.show()

#仿射变换
#im_fs=img_yu.transform((int(1.4*img_yu.width),img_yu.height),Image.AFFINE,data=(1,-0.5,0,0,1,0))
#im_fs.show()

#透视变换
#params=[1,0.1,0,-0.1,0.5,0,-0.005,-0.001]
#img_ts=img_yu.transform((img_yu.width//3,img_yu.height),Image.PERSPECTIVE,params,Image.BICUBIC)
#img_ts.show()

#更改图像的像素值----putpixel()---输出噪声图像
#img_k=img_yu.copy()
#n=5000
#x,y=np.random.randint(0,img_yu.width,n),np.random.randint(0,img_yu.height,n)
#for (x,y) in zip(x,y):
#    img_k.putpixel((x,y),((0,0,0) if np.random.rand()<0.5 else(255,255,255)))
#img_k.show()

#在图像上画图形---ImageDraw
#draw=ImageDraw.Draw(img_yu)
#draw.ellipse((100,125,110,250),fill=(255,255,255,128))
#del draw
#img_yu.show()

#在图像上添加文字
#font=ImageFont.truetype('arial.ttf',23)
#draw.text((10,5),"welcom to China!")
#del draw
#img_yu.show()


#创建缩略图---thumbnail()函数
#im_suo=img_yu.copy()
#im_suo.thumbnail((100,100))
#img_yu.paste(im_suo,(10,10))
#img_yu.show()

#计算图像基本统计信息----stat模块
#s=ImageStat.Stat(img_yu)
#平均值
#print(s.mean)
##中值
#print(s.median)
##个数
#print(s.count)
##标准差
#print(s.stddev)


#绘制5RGB图像直方图----histogram()
#p1=img_yu.histogram()
#plt.bar(range(256),p1[:256],color='r',alpha=0.5)
#plt.bar(range(256),p1[256:2*256],color='g',alpha=0.4)
#plt.bar(range(256),p1[2*256:],color='b',alpha=0.4)
#plt.show()

#分离RGB通道
#方法一:----split（）函数
#r,g,b=img_yu.split()
#方法二：
img_yu11=np.array(img_yu)
#r1=img_yu11[:,:,0]
#g1=img_yu11[:,:,1]
#b1=img_yu11[:,:,2]
#以上两种方法所展示的图片有点区别
#plt.subplot(1,3,1);plt.imshow(r,cmap=plt.cm.Reds);plt.axis('off')
#plt.subplot(1,3,2);plt.imshow(g,cmap=plt.cm.Greens);plt.axis('off')
#plt.subplot(1,3,3);plt.imshow(b,cmap=plt.cm.Blues);plt.axis('off')



#合并多个通道----merge（）
#jk=Image.merge('RGB',(r,g,b))
#jk.show()



#两幅图像的a混合---blend()---两个图像的大小和模式必须相同
#RGBA模式，----img_yu为RGB模式
#img_hill=Image.open('F:\\python练习\\图像实战练习\\images\\hill.png')
#img_yu21=img_yu.convert('RGBA')

#调整大小
#imh_hill=img_hill.resize((img_yu21.width,img_yu21.height),Image.BILINEAR)
#imhh=Image.blend(img_hill,img_yu21,alpha=0.5)
#imhh.show()


#两张图片进行叠加----multiply
#ty=ImageChops.multiply(img_hill,img_yu21)
#ty.show()


#两幅图片相加--add
#xj=ImageChops.add(img_hill,img_yu21)
#xj.show()


#计算两图像之间的差值---different函数----大小一样
#goall=Image.open('F:\\python练习\\图像实战练习\\images\\goal1.png')
#goal2=Image.open('F:\\python练习\\图像实战练习\\images\\goal2.png')

#diff=ImageChops.difference(goall,goal2)
#diff.show()


#减去两个图像和叠加两个图片负片-----substract()：先减去两个图像，然后将结果除以比例，再加上偏移量
#sub=ImageChops.subtract(goall,goal2)
#sub.show()

#scr=ImageChops.screen(goall,goal2)
#scr.show()

#使用scikit-image进行图像操作
#反向扭曲和几何转换----wrap()---仿射变换--SimilarityTransform()---计算变换矩阵
#tform=transform.SimilarityTransform(scale=0.9,rotation=np.pi/4,translation=(img_yu11.shape[0]/2,-100))
#warped=transform.warp(img_yu11,tform)
#plt.imshow(warped)



#应用旋流变换----swirl()函数---strength旋流量参数，radius--以像素表示旋流程度，rotation添加旋转角度
#swirled=transform.swirl(img_yu11,rotation=0,strength=15,radius=200)
#plt.imshow(swirled)


#在图像中添加高斯噪声--random_noise
#yi=img_as_float(img_yu11)
#sigmas=[0.1,0.25,0.5,1]
#for i in range(4):
#    noisy=util.random_noise(yi,var=sigmas[i]**2)
#    plt.subplot(2,2,i+1)
#    plt.imshow(noisy)
#    plt.axis('off')
#    plt.title('Gaussian noise'+str(sigmas[i]),size=20)
#plt.tight_layout()
#plt.show()


#使用matplotlib进行图像操作---pylab模块进行操作--图像轮廓
#eg=rgb2gray(io.imread('F:\\python练习\\图像实战练习\\images\\einstein.jpg'))
#plt.figure(figsize=(10,8))
#plt.subplot(131),plt.imshow(eg,cmap='gray'),plt.title('Original')
#plt.subplot(132),plt.contour(np.flipud(eg),colord='k',levels=np.logspace(-15,15,100))
#plt.title('Imgaee contour')
#plt.subplot(133),plt.title('Image Filed'),plt.contourf(np.flipud(eg),cmap='inferno')
#plt.show()

